package com.sen.gulimall.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 本地事务失效问题
 * 同一个对象事务方法互调默认失效。原因：绕过了代理对象，事务使用代理对象来控制的
 * 解决：使用代理对象来调用事务方法
 * - 1）、导入spring-boot-starter-aop场景：引入了aspectj
 * - 2）、@EnableAspectJAutoProxy(exposeProxy=true)：对外暴露代理对象，开启 aspectj 动态代理功能，以后所有的动态代理都是aspectj创建的（即使没有接口也可以创建动态代理）
 * - 3）、AopContext.currentProxy() 本类调用方法
 *      OrderServiceImpl orderService = (OrderServiceImpl)AopContext.currentProxy();
 *      orderService.b();
 *      orderService.c();
 *
 * Seata控制分布式事务
 * 1）、每一个微服务先必须创建undo_log；
 * 2）、按照事务协调器；seata-server: https://github.com/seata/seata/releases
 * 3）、整合
 *     1、导入依赖 spring-cloud-starter-alibaba-seata    seata-all-1.4.2
 *     2、解压并启动seata-server
 *          registry.conf：注册中心配置； 修改registry type= nacos
 *          file.conf：seata的配置
 *     3、所有想要用到分布式事务的微服务，都应该使用Seata DataSourceProxy代理自己的数据源
 *     4、每个微服务，都必须导入file.conf、registry.conf
 *          配置 spring.cloud.alibaba.seata.tx-service-group={application-name}-fescar-service-group
 *     5、启动测试分布式事务
 *     6、给分布式大事务的入口标注@GlobalTransactional
 *     7、每一个远程的小事务用 @Transactional
 */

@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
